/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pr3.mutacion;

import pr3.cromosoma.CromosomaArbol;
import pr3.cromosoma.CromosomaIterator;
import pr3.funcion.Funcion;

/**
 *
 * @author Gonzalo Ortiz Jaureguizar (gortiz at software.imdea.org)
 */
public abstract class MutacionCromosomaArbol implements EstrategiaMutacion<CromosomaArbol> {

    @Override
    public void muta(CromosomaArbol cromosoma, double prob) {
        CromosomaIterator it = cromosoma.iterator();
        while(it.hasNext()) {
            Funcion f = it.next();
            for (int i = 0; i < f.getAridad(); i++) { //se mutan los hijos de un nodo padre
                if (isNodoMutable(f) && Math.random() < prob) {
                    Funcion mutado = f.getArgumento(i);
                    f.setArgumento(i, getMutante(mutado));
                    f.getArgumento(i).setPadre(f);
                    it.ignorar(mutado); //evitamos mutar los hijos de un elemento ya mutado
                    break;
                }
            }
        }
    }

    protected abstract boolean isNodoMutable(Funcion nodo);

    protected abstract Funcion getMutante(Funcion nodo);
}
